package cn.virens.common.utils;

import cn.hutool.core.util.ReUtil;
import cn.virens.common.exception.APIException;

import java.util.Collection;
import java.util.Map;
import java.util.regex.Pattern;

/**
 * 普通验证器
 *
 * @author loioi
 */
public class Assert {
    /**
     * 验证是否为NULL
     *
     * @param <T> 待验证值类型
     * @param obj 待验证值
     * @return 验证值
     */
    public static <T> T isNull(T obj) {
        return isNull(obj, "NULL", "参数为空");
    }

    /**
     * 验证是否为NULL
     *
     * @param <T>     待验证值类型
     * @param obj     待验证值
     * @param message 错误提示
     * @return 验证值
     */
    public static <T> T isNull(T obj, String message) {
        return isNull(obj, "NULL", message);
    }

    /**
     * 验证是否为NULL
     *
     * @param <T>     待验证值类型
     * @param obj     待验证值
     * @param code    错误码
     * @param message 错误提示
     * @return 验证值
     */
    public static <T> T isNull(T obj, String code, String message) {
        if (obj == null) {
            throw new APIException(code, message);
        } else {
            return obj;
        }
    }

    /**
     * 验证是否为空
     *
     * @param <T> 待验证值类型
     * @param obj 待验证值
     * @return 验证值
     */
    public static <T> T isEmpty(T obj) {
        return isEmpty(obj, "NULL", "参数为空");
    }

    /**
     * 验证是否为空
     *
     * @param <T>     待验证值类型
     * @param obj     待验证值
     * @param message 错误提示
     * @return 验证值
     */
    public static <T> T isEmpty(T obj, String message) {
        return isEmpty(obj, "NULL", message);
    }

    /**
     * 验证是否为空
     *
     * @param <T>     待验证值类型
     * @param obj     待验证值
     * @param code    错误码
     * @param message 错误提示
     * @return 验证值
     */
    public static <T> T isEmpty(T obj, String code, String message) {
        if (obj == null) {
            throw new APIException(code, message);
        } else if (obj instanceof Map && ((Map<?, ?>) obj).isEmpty()) {
            throw new APIException(code, message);
        } else if (obj.getClass().isArray() && ((Object[]) obj).length == 0) {
            throw new APIException(code, message);
        } else if (obj instanceof Collection && ((Collection<?>) obj).isEmpty()) {
            throw new APIException(code, message);
        } else if (obj instanceof CharSequence && ((CharSequence) obj).length() == 0) {
            throw new APIException(code, message);
        } else {
            return obj;
        }
    }

    /**
     * 根据正则表达式验证数据是否符合要求
     *
     * @param str     待验证值
     * @param reg     正则表达式
     * @param message 错误消息
     * @return 验证值
     * @throws APIException 验证失败异常
     */
    public static String isReg(String str, String reg, String message) throws APIException {
        if (reg == null || str == null || !ReUtil.isMatch(reg, str)) {
            throw new APIException("ERROR", message);
        } else {
            return str;
        }
    }

    /**
     * 根据正则表达式验证数据是否符合要求
     *
     * @param str     待验证值
     * @param reg     正则表达式
     * @param message 错误消息
     * @return 验证值
     * @throws APIException 验证失败异常
     */
    public static String isReg(String str, Pattern reg, String message) throws APIException {
        if (reg == null || str == null || !ReUtil.isMatch(reg, str)) {
            throw new APIException("ERROR", message);
        } else {
            return str;
        }
    }

    /**
     * 验证数据库插入操作结果是否成功
     *
     * @param i       待验证值
     * @param message 错误消息
     * @throws APIException 验证失败异常
     */
    public static void isInsert(Integer i, String message) throws APIException {
        if (i == null || i <= 0) throw new APIException("INSERT_ERR", message);
    }

    /**
     * 验证数据库更新操作结果是否成功
     *
     * @param i       待验证值
     * @param message 错误消息
     * @throws APIException 验证失败异常
     */
    public static void isUpadte(Integer i, String message) throws APIException {
        if (i == null || i <= 0) throw new APIException("UPDATE_ERR", message);
    }

    /**
     * 验证输入值必须为True
     *
     * @param bool    待验证值
     * @param message 错误消息
     * @throws APIException 验证失败异常
     */
    public static void isTrue(Boolean bool, String message) throws APIException {
        if (bool == null || !bool) throw new APIException("ERROR", message);
    }

    /**
     * 验证输入值必须为False
     *
     * @param bool    待验证值
     * @param message 错误消息
     * @throws APIException 验证失败异常
     */
    public static void isFalse(Boolean bool, String message) throws APIException {
        if (bool != null && bool) throw new APIException("ERROR", message);
    }
}
